/**
 * @brief TI TMP112 系列温度传感器驱动
 * @detail TMP112 系列只在与 SMBus、两线制和 I2C 接口兼容的总线上作为从器件运行，并通过开漏 I/O 线路 SDA 和 SCL 与 MCU 建立连接
 * @author 张勇 / 2020-05-13
 */

#pragma once

#include "mcu.h"
#include "simi2c.h"

#ifdef __cplusplus
extern "C" {
#endif

// forward
typedef struct _unidrv_tmp112 unidrv_tmp112_t;

/// @brief ALERT 时回调函数
typedef void (*unidrv_tmp112_alert_callback_t)(unidrv_tmp112_t* dev, void* cookie);

/// @brief TMP112 系列温度传感器驱动数据结构
typedef struct _unidrv_tmp112 {
    /// @brief 使用的 I2C 总线
    mcu_i2c_t* i2c;
    /// @brief 在 I2C 总线上的监听地址
    mcu_i2c_slave_addr_t addr;
    /// @brief ALERT 引脚
    //mcu_gpio_num_t alert_gpio_num;
    /// @brief ALERT 时回调
    //unidrv_tmp112_alert_callback_t alert_callback;
    /// @brief ALERT 时回调 cookie
    //void* alert_callback_cookie;
} unidrv_tmp112_t;

/// @brief TMP112 读取当前温度(单位: 0.01C)
std_err_t unidrv_tmp112_read_temperature(unidrv_tmp112_t* dev, int32_t* temperature);

/// @brief TMP112 设置 ALERT 温度
/// @param thigh 温度高于此温度时告警(单位: 0.01C)
/// @param tlow 温度低于此温度时告警(单位: 0.01C)
/// @param alert_callback, alert_callback_cookie ALERT 时回调函数
std_err_t unidrv_tmp112_alert_config(unidrv_tmp112_t* dev, int32_t thigh, int32_t tlow, unidrv_tmp112_alert_callback_t alert_callback, void* alert_callback_cookie);

/// @brief TMP112 开始/停止 监听温度告警
std_err_t unidrv_tmp112_alert_enable(unidrv_tmp112_t* dev, bool enable);

/// @brief 使用 SIMI2C 接口读取 TMP112 温度(单位 0.01C)
std_err_t unidrv_simi2c_tmp112_read_temperature(unidrv_simi2c_t *dev, uint8_t addr, int *value);
	
#ifdef __cplusplus
}
#endif
